---@class GT.sfx 特效
---@field sfx Sfx 特效对象
GT.sfx = class()

---@class sfx_data
---@field sfx Sfx 特效对象


---@param data sfx_data
function GT.sfx:ctor(data)
    self.sfx = data.sfx
end


---@param sfx Sfx 特效对象
---@return GT.sfx
function GT.sfx.obj(sfx)
    return new(GT.sfx, {sfx=sfx})
end
 
---@class sfx_on_point 创建特效到点
---@field sfx_id SfxKey 特效编号 必填
---@field point GT.point 点 必填
---@field face_angle Float 面向角度 可选 默认 0
---@field scale Float 缩放比例 可选 默认 1
---@field height Float 高度 可选 默认 0
---@field duration Float 持续时间 可选 默认 1

--- 创建特效到点
---@param data sfx_on_point
---@return GT.sfx
function GT.sfx.create_sfx_on_point(data)
    return GT.sfx.obj(game_api.create_sfx_on_point(data.sfx_id, data.point.point, data.face_angle or 0, data.scale or 1, data.height or 0, data.duration or 1))
end

--- 在某点播放特效
---@param point GT.point 点
---@param sfx SfxKey 特效编号
---@param scale Fixed 缩放
---@param duratime Fixed 持续时间
---@param offset Fixed 竖直方向偏移
---@param role GT.player 玩家
---@param visible_type UInt32 显示类型（1：全体，2：自己 3：仅自己和友方 4：非自己和友方
---@param rotation Fixed 初始旋转角度
---@return GT.sfx
function GT.sfx.play_sfx_on_point(point, sfx, scale, duratime, offset, role, visible_type, rotation)
    return GT.sfx.obj(game_api.play_sfx_on_point(point.point, sfx, scale, duratime, offset, role.player, visible_type, rotation))
end


---@class sfx_on_unit 创建特效到单位附加点
---@field sfx_id SfxKey 特效编号 必填
---@field unit GT.unit 单位 必填
---@field socket Str 单位挂接点 必填
---@field b_follow_rotate Bool 是否跟随单位旋转 可选 默认 false
---@field b_follow_scale Bool 是否跟随单位缩放 可选 默认 true
---@field scale Float 缩放比例 可选 默认 1
---@field duration Float 持续时间 可选 默认 1
---@field angle Float 角度 可选 默认 0

--- 创建特效到单位附加点
---@param data sfx_on_unit
---@return GT.sfx
function GT.sfx.create_sfx_on_unit(data)
    return  GT.sfx.obj(game_api.create_sfx_on_unit(data.sfx_id, data.unit.unit, data.socket, data.b_follow_rotate or false, data.b_follow_scale or true, data.scale or 1, data.duration or 1,data.angle or 0))
end

--- 创建特效到单位附加点（跟随旋转使用枚举）
---@param sfx_id SfxKey 特效编号
---@param unit GT.unit 单位
---@param socket Str 单位挂接点
---@param rotate_type Int32 跟随旋转方式
---@param b_follow_scale Bool 是否跟随单位缩放
---@param scale Float 缩放比例
---@param duration Float 持续时间
---@param angle Float 角度
---@return GT.sfx
function create_sfx_on_unit_new(sfx_id, unit, socket, rotate_type, b_follow_scale, scale, duration, angle)
    return GT.sfx.obj(game_api.create_sfx_on_unit_new(sfx_id, unit.unit, socket, rotate_type, b_follow_scale, scale, duration,angle))
end

--- 播放屏幕特效并返回特效实体
---@param sfx_key SfxKey 特效编号
---@param keep_time Float 持续时间
---@param role GT.player 玩家
---@param render_after_post Bool 是否后处理之后渲染
---@return GT.sfx
function GT.sfx.add_sfx_to_camera_with_return(sfx_key, keep_time, role, render_after_post)
    return GT.sfx.obj(game_api.add_sfx_to_camera_with_return(sfx_key, keep_time, role.player, render_after_post))
end

--- 删除特效
---@param immediately Bool 立即移除表现
function GT.sfx:delete_sfx(immediately)
    game_api.delete_sfx(self.sfx, immediately)
end

--- 设置特效旋转
---@param rotate_x Float x轴旋转
---@param rotate_y Float y轴旋转
---@param rotate_z Float z轴旋转
function GT.sfx:set_sfx_rotate(rotate_x, rotate_y, rotate_z)
    game_api.set_sfx_rotate(self.sfx, rotate_x, rotate_y, rotate_z)
end

--- 设置特效朝向
---@param face_angle Float 朝向
function GT.sfx:set_sfx_angle(face_angle)
    game_api.set_sfx_angle(self.sfx, face_angle)
end

--- 设置特效缩放
---@param scale_x Float x轴缩放
---@param scale_y Float y轴缩放
---@param scale_z Float z轴缩放
function GT.sfx:set_sfx_scale(scale_x, scale_y, scale_z)
    game_api.set_sfx_scale(self.sfx, scale_x, scale_y, scale_z)
end

--- 设置特效高度
---@param height Float 高度
function GT.sfx:set_sfx_height(height)
    game_api.set_sfx_height(self.sfx, height)
end

--- 设置特效到点
---@param point Point 点
function GT.sfx:set_sfx_position(point)
    game_api.set_sfx_position(self.sfx, point)
end

--- 设置特效动画速度
---@param speed Float 动画速度
function GT.sfx:set_sfx_animation_speed(speed)
    game_api.set_sfx_animation_speed(self.sfx, speed)
end

--- 设置特效持续时间
---@param duration Float 持续时间
function GT.sfx:set_sfx_duration(duration)
    game_api.set_sfx_duration(self.sfx, duration)
end

--- 播放屏幕特效
---@param sfx_key SfxKey 特效编号
---@param keep_time Float 持续时间
---@param role Role 玩家
---@param render_after_post Bool 是否后处理之后渲染
function GT.sfx.add_sfx_to_camera(sfx_key, keep_time, role, render_after_post)
    game_api.add_sfx_to_camera(sfx_key, keep_time, role, render_after_post)
end

--- 特效是否存在
---@param sfx Sfx 特效
---@return Bool
function GT.sfx.sfx_is_exist(sfx)
    return game_api.sfx_is_exist(sfx)
end